/*
 * 文 件 名:  SpringContextUtil.java
 * 版    权:  ETOC 信息技术有限公司, Ltd. Copyright YYYY-YYYY,  All rights reserved
 * 描    述:  <描述>
 * 修 改 人:  Administrator
 * 修改时间:  2017年6月29日
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.etoc.test.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * Spring的applicationContext持有类
 * 在工程的spring配置xml文件引入
 * <pre>
 * &lt;bean id="SpringContextHolder" class="com.etoc.tools.spring.SpringContextHolder" /&gt;
 * </pre>
 * 
 * @author  陈超
 * @version  [版本号, 2017年6月29日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public final class SpringContextHolder implements ApplicationContextAware {
	private static ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringContextHolder.applicationContext = applicationContext;
	}
	
	/**
	 * 获取Spring应用的applicationContext对象
	 * <功能详细描述>
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static ApplicationContext getApplicationContext() {
		return SpringContextHolder.applicationContext;
	}
	
	/**
	 * 根据id值获取bean对象
	 * <功能详细描述>
	 * @param name bean的id值
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static Object getBean(String name){
		return applicationContext.getBean(name);
	}
	
	/**
	 * 根据bean的Class对象获取bean对象
	 * <功能详细描述>
	 * @param requiredType bean的Class对象
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static <T> T getBean(Class<T> requiredType){
		return applicationContext.getBean(requiredType);
	}
	
	/**
	 * 根据id值和Class对象获取bean对象
	 * <功能详细描述>
	 * @param name bean的id值
	 * @param requiredType bean的Class对象
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
    public static <T> T getBean(String name, Class<T> requiredType) {
    	return applicationContext.getBean(name, requiredType);
    }
    
    /**
     * 根据bean的Class对象和构造参数列表获取bean对象
     * <功能详细描述>
     * @param requiredType bean的Class对象
     * @param args 构造参数列表
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> T getBean(Class<T> requiredType, Object... args) {
    	return applicationContext.getBean(requiredType, args);
    }
}
